/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package fr.ul.ade.prime.analyzer;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Classe permettant de parser le flux XML récupérer grâce a la fonction
 * setProject de l'API
 * @author Zanette Sébastien, Andrianjafintrimo Victor
 */
public class ParserProject extends DefaultHandler {

	// nom des tags XML
	private static final String PROJECTS = "projects";
	private static final String PROJECT = "project";
	private static final String ID = "id";
	private static final String NAME = "name";
	private static final String LOADED = "loaded";
	// Array list de feeds	
	private ArrayList<FeedProject> feeds;
	// Boolean permettant de savoir si nous sommes � l'int�rieur d'un PROJECT
	private boolean inProject;
	// Feed courant
	private FeedProject currentFeed;
	// Buffer permettant de contenir les donn�es d'un tag XML
	private StringBuffer buffer;

	/**
	 * Appelle la fonction processingInstruction de la classe DefaultHandler
	 *
	 * @param target
	 * @param data
	 * @throws SAXException
	 */
	@Override
	public void processingInstruction(String target, String data) throws SAXException {
		super.processingInstruction(target, data);
	}

	/**
	 * Constructeur de la classe ParserProject
	 */
	public ParserProject() {
		super();
	}

	/**
	 * Cette méthode est appelée par le parser une et une seule fois au
	 * démarrage de l'analyse de votre flux xml. Elle est appelée avant toutes
	 * les autres méthodes de l'interface, à l'exception unique, évidemment, de
	 * la méthode setDocumentLocator. Cet évènement devrait vous permettre
	 * d'initialiser tout ce qui doit l'être avant le début du parcours du
	 * document.
	 *
	 * @throws SAXException
	 */
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		this.feeds = new ArrayList<FeedProject>();

	}

	/**
	 * Fonction étant déclenchée lorsque le parser trouve un tag XML C'est cette
	 * méthode que nous allons utiliser pour instancier un nouveau feed
	 *
	 * @param uri
	 * @param localName
	 * @param name
	 * @param attributes
	 * @throws SAXException
	 */
	@Override
	public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
		// Nous r�initialisons le buffer a chaque fois qu'il rencontre un EVENT
		this.buffer = new StringBuffer();

		// Ci dessous, localName contient le nom du tag rencontr�

		// Nous avons rencontr� un tag PROJECTS, il faut donc instancier une nouvelle liste de  feed
		if (localName.equalsIgnoreCase(PROJECTS)) {
			//ne rien faire car déja fait dans startDocument()
		}

		// Nous avons rencontr� un tag PROJECT, il faut donc instancier un nouveau feed
		if (localName.equalsIgnoreCase(PROJECT)) {
			this.currentFeed = new FeedProject();
			this.currentFeed.setId(attributes.getValue(ID));
			this.currentFeed.setName(attributes.getValue(NAME));
			this.currentFeed.setLoaded(attributes.getValue(LOADED));
			this.feeds.add(this.currentFeed);
		}

	}

	/**
	 * Fonction �tant d�clench�e lorsque le parser � pars� l'int�rieur de la
	 * balise XML La m�thode characters a donc fait son ouvrage et tous les
	 * caract�re inclus dans la balise en cours sont copi�s dans le buffer On
	 * peut donc tranquillement les r�cup�rer pour compl�ter notre objet
	 * currentFeed.
	 *
	 * @param uri
	 * @param localName
	 * @param name
	 * @throws SAXException
	 */
	@Override
	public void endElement(String uri, String localName, String name) throws SAXException {

		if (localName.equalsIgnoreCase(PROJECT)) {
			//Ne rien faire, pas de balise de fin
		}

		if (localName.equalsIgnoreCase(PROJECTS)) {
			//Ne rien faire, pas d'ouverture/fermeture de balise dans le flux
		}
	}

	/**
	 * Tout ce qui est dans l'arborescence mais n'est pas partie int�grante d'un
	 * tag, d�clenche la lev�e de cet �v�nement. En g�n�ral, cet �v�nement est
	 * donc lev� tout simplement par la pr�sence de texte entre la balise
	 * d'ouverture et la balise de fermeture
	 * @param ch
	 * @param start
	 * @param length
	 */
	@Override
	public void characters(char[] ch, int start, int length) {
		String lecture = new String(ch, start, length);
		if (this.buffer != null) {
			this.buffer.append(lecture);
		}
	}


	/**
	 * Méthode prmettant de récupérr les données
	 * @return  la liste de FeedProject
	 */
	public ArrayList<FeedProject> getData() {
		return this.feeds;

	}
}
